/* Copyright (c) 2011 Timothée Lacroix
 * This file is part of HINAPT.
 *
 * HINAPT is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * HINAPT is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with HINAPT.  If not, see <http://www.gnu.org/licenses/>.
 */

/*!
  \file detector.hpp
  Implémentation d'un détecteur créé par Viola-Jones, vecteur de Classifieurs
 */

#ifndef DETECTOR_HPP_INCLUDED
#define DETECTOR_HPP_INCLUDED

#include "_hinapt.hpp"
#include "classifier.hpp"

class ClassifierTh;
/*!
  Représente un détecteur créé par Viola-Jones
*/
class DetectorTh : public vector<ClassifierTh*>
{
public:
  DetectorTh(void):vector<ClassifierTh*>(){};
  /*!
    Méthode de debug pour afficher la composition du détecteur
  */
  void print();
  /*!
    \param output flux de sortie pour la sauvegarde du Détecteur
    \return retourne true si l'écriture s'est bien passée, false sinon
  */
  bool save(ostream &output);
  /*!
    \param output flux d'entrée pour le chargement du Détecteur
    \return retourne true si la lecture s'est bien passée, false sinon
  */
  bool load(istream &input);
  /*!
    \param[out] eyes contiendra la liste des positions des yeux détectés
    \param img l'image intégrale sur laquelle on souhaite détecter les yeux
    \param ratio ratio par lequel on diminue la taille de la fenêtre à chaque
            itération
    \param prof nombre d'itérations
  */
  void detect(vector<Rect> &eyes,Mat &img,double ratio=0.9,double prof=30);
  /*!
    \param img l'image intégrale sur laquelle on évalue le détecteur
    \param weight permet de pondérer l'évaluation des features, pour que les
            seuils calculés sur les images d'entrainement correspondent
    \return 1 si l'image est détectée positive, -1 sinon
  */
  int eval(Mat img,double weight=1);

  /*!
    \param[out] F contiendra le taux de faux positifs
    \param[out] D contiendra le taux de détection
    \param validationSet l'ensemble de validation
    \param trueVal trueVal[i] est à 1 si validationSet[i] est positif, -1 sinon
  */
  void findFD(double &F,double &D,
              vector<Mat>& validationSet,
              vector<int> &trueVal);

  /*!
    \param[out] D contiendra le taux de détection
    \param validationSet l'ensemble de validation
    \param trueVal trueVal[i] est à 1 si validationSet[i] est positif, -1 sinon
  */
  void findD(double &D, vector<Mat>& validationSet, vector<int> &trueVal);

};

#endif // DETECTOR_HPP_INCLUDED

